package com.springboot.redis.repository;

import com.springboot.redis.domain.Post;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author: 陈玉林
 * @modifiedBy:
 * @date: Create In 20:59 2018/7/19
 * @description:
 */
//必须配置cacheNames
@CacheConfig(cacheNames = "post")
public interface PostRepository extends PagingAndSortingRepository<Post, Integer> {
    /**
     * #p0代表第一个参数，也就是id。这句话加上之后，当你在调用findById时，就会先从redis的post缓存对象里去查询
     * key等于传过来的id的值。如果没有，就去查表;若id为1，则该缓存的key为“post::1“
     */
    @Cacheable(key = "#p0")
    Post findById(int id);

    /**
     * 新增或修改时
     * 在save方法上加了个CachePut，代表往缓存里添加值，key为参数post的id属性，这样当我们save一个Post对象时，
     * redis就会新增一个以id为key的Post对象；如果是update操作，那同样，redis会覆盖id相同的Post对象的值，也完
     * 成一次更新。
     */
    @CachePut(key = "#p0.id")
    @Override
    Post save(Post post);


    //删除时要添加以下几个注解
    @Transactional
    @Modifying
    @CacheEvict(key = "#p0")
    int deleteById(int id);


    @Cacheable(key = "#root.methodName")
    @Override
    List<Post> findAll();
}
